# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html

load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
load("@rules_rust//cargo:cargo_build_script.bzl", "cargo_build_script")
load(":rustfmt.bzl", "rustfmt_fix", "rustfmt_test")
load("//ts/sql_format:defs.bzl", "sql_format")

# Build script
#######################

cargo_build_script(
    name = "build_script",
    srcs = glob(["build/*.rs"]),
    build_script_env = {
        "PROTO_TOP": "$(location //proto:.top_level)",
        "PROTOC": "$(location @com_google_protobuf//:protoc)",
        "RSLIB_FTL_ROOT": "$(location @rslib_ftl//:l10n.toml)",
        "EXTRA_FTL_ROOT": "$(location @extra_ftl//:l10n.toml)",
        "BAZEL": "1",
    },
    crate_root = "build/main.rs",
    data = [
        "//ftl",
        "//proto",
        "@com_google_protobuf//:protoc",
        # bazel requires us to list these out separately
        "//proto:.top_level",
        "@rslib_ftl//:l10n.toml",
        "@extra_ftl//:l10n.toml",
    ],
    deps = [
        "//rslib/cargo:prost_build",
    ],
)

# Library
#######################

_anki_compile_data = glob([
    "src/**/*.sql",
    "src/**/*.html",
    "src/**/*.css",
    "src/**/*.tex",
]) + [
    "Cargo.toml",  # prevents a warning about num_enum
    "//:buildinfo.txt",
]

_anki_features = [
    "translations",
]

_anki_rustc_env = {
    "BUILDINFO": "$(location //:buildinfo.txt)",
}

rust_library(
    name = "anki",
    srcs = glob([
        "src/**/*.rs",
    ]),
    compile_data = _anki_compile_data,
    crate_features = _anki_features,
    proc_macro_deps = [
        "//rslib/cargo:async_trait",
        "//rslib/cargo:serde_derive",
        "//rslib/cargo:serde_repr",
    ],
    rustc_env = _anki_rustc_env,
    visibility = ["//visibility:public"],
    deps = [
        ":build_script",
        "//rslib/cargo:ammonia",
        "//rslib/cargo:blake3",
        "//rslib/cargo:bytes",
        "//rslib/cargo:chrono",
        "//rslib/cargo:coarsetime",
        "//rslib/cargo:flate2",
        "//rslib/cargo:fluent",
        "//rslib/cargo:fnv",
        "//rslib/cargo:futures",
        "//rslib/cargo:hex",
        "//rslib/cargo:htmlescape",
        "//rslib/cargo:id_tree",
        "//rslib/cargo:intl_memoizer",
        "//rslib/cargo:itertools",
        "//rslib/cargo:lazy_static",
        "//rslib/cargo:nom",
        "//rslib/cargo:num_cpus",
        "//rslib/cargo:num_enum",
        "//rslib/cargo:num_integer",
        "//rslib/cargo:once_cell",
        "//rslib/cargo:pin_project",
        "//rslib/cargo:prost",
        "//rslib/cargo:pulldown_cmark",
        "//rslib/cargo:rand",
        "//rslib/cargo:regex",
        "//rslib/cargo:rusqlite",
        "//rslib/cargo:scopeguard",
        "//rslib/cargo:serde",
        "//rslib/cargo:serde_aux",
        "//rslib/cargo:serde_json",
        "//rslib/cargo:serde_tuple",
        "//rslib/cargo:sha1",
        "//rslib/cargo:slog",
        "//rslib/cargo:slog_async",
        "//rslib/cargo:slog_envlogger",
        "//rslib/cargo:slog_term",
        "//rslib/cargo:strum",
        "//rslib/cargo:tempfile",
        "//rslib/cargo:tokio",
        "//rslib/cargo:tokio_util",
        "//rslib/cargo:unic_langid",
        "//rslib/cargo:unicase",
        "//rslib/cargo:unicode_normalization",
        "//rslib/cargo:unic_ucd_category",
        "//rslib/cargo:utime",
        "//rslib/cargo:zip",
        "//rslib/cargo:zstd",
        "//rslib/cargo:pct_str",
        "//rslib/i18n:anki_i18n",
    ] + select({
        # rustls on Linux
        "//platforms:linux_x86_64": ["@reqwest_rustls//:reqwest"],
        "//platforms:linux_arm64": ["@reqwest_rustls//:reqwest"],
        # native tls on other platforms
        "//conditions:default": ["//rslib/cargo:reqwest"],
    }),
)

# Tests
#######################

rust_test(
    name = "anki_tests",
    compile_data = _anki_compile_data,
    crate = ":anki",
    crate_features = _anki_features,
    data = glob([
        "tests/support/**",
    ]),
    rustc_env = _anki_rustc_env,
    rustc_flags = [
        "-Dclippy::dbg_macro",
    ],
    deps = [
        "//rslib/cargo:env_logger",
        "//rslib/cargo:linkcheck",
        "//rslib/cargo:utime",
    ],
)

rustfmt_test(
    name = "format_check",
    srcs = glob([
        "**/*.rs",
    ]),
)

rustfmt_fix(
    name = "format",
    srcs = glob([
        "**/*.rs",
    ]),
)

sql_format(
    name = "sql_format",
    srcs = glob(["**/*.sql"]),
)
